package com.platform.metamodel.service;

import org.apache.metamodel.create.CreateIndex;
import org.apache.metamodel.create.CreateTable;
import org.apache.metamodel.drop.DropIndex;
import org.apache.metamodel.modify.ActionType;
import org.apache.metamodel.schema.MutableColumn;
import org.apache.metamodel.schema.MutableIndex;
import org.apache.metamodel.schema.Table;
import org.apache.metamodel.schema.UniqueKeys;

import javax.sql.DataSource;
import java.sql.Connection;
import java.util.List;
import java.util.Map;

/**
 * @author liujizheng
 * @version 1.0
 * @ClassName JdbcUpdateService
 * @Description jdbc 表操作接口
 * @date 2021/8/9 11:52
 */
public interface JdbcUpdateService {

    /**
     * 创建表
     * @param dataSource  数据源
     * @param createTable 创建表封装
     * @return 执行成功： true
     */
    boolean createTable(DataSource dataSource, CreateTable createTable);

    /**
     * 创建表
     * @param connection  数据库连接
     * @param createTable 创建表封装
     * @return 执行成功： true
     */
    boolean createTable(Connection connection, CreateTable createTable);

    /**
     * 创建表
     * @param dataSource  数据源
     * @param schemaName  方案或数据库名
     * @param tableName   数据表名
     * @param columnList  字段列表
     * @return 执行成功： true
     */
    boolean createTable(DataSource dataSource, String schemaName, String tableName, List<MutableColumn> columnList);

    boolean createTable(DataSource dataSource, String schemaName, String tableName, List<MutableColumn> columnList,Map<String,String> map);
    /**
     *
     * 创建表
     * @param connection  数据库连接
     * @param schemaName  方案或数据库名
     * @param tableName   数据表名
     * @param columnList  字段列表
     * @return 执行成功： true
     */
    boolean createTable(Connection connection, String schemaName, String tableName, List<MutableColumn> columnList);

    /**
     *
     * 创建表
     * @param dataSource  数据源
     * @param schemaName  方案或数据库名
     * @param tableName   数据表名
     * @return 执行成功： true
     */
    boolean dropTable(DataSource dataSource, String schemaName, String tableName);

    /**
     * 表增加字段
     * @param dataSource  数据源
     * @param schemaName  方案或数据库名
     * @param tableName   数据表名
     * @param column      字段
     * @return 执行成功： true
     */
    boolean addColumn(DataSource dataSource, String schemaName, String tableName, MutableColumn column);

    /**
     * 表增加字段
     * @param connection  数据库连接
     * @param schemaName  方案或数据库名
     * @param tableName   数据表名
     * @param column      字段
     * @return 执行成功： true
     */
    boolean addColumn(Connection connection, String schemaName, String tableName, MutableColumn column);

    /**
     * 表删除字段
     * @param dataSource  数据源
     * @param schemaName  方案或数据库名
     * @param tableName   数据表名
     * @param columnName  字段名
     * @return 执行成功： true
     */
    boolean dropColumn(DataSource dataSource, String schemaName, String tableName, String columnName);

    /**
     * 表删除字段
     * @param connection  数据库连接
     * @param schemaName  方案或数据库名
     * @param tableName   数据表名
     * @param columnName  字段名
     * @return 执行成功： true
     */
    boolean dropColumn(Connection connection, String schemaName, String tableName, String columnName);

    /**
     * 表修改字段
     * @param dataSource  数据源
     * @param schemaName  方案或数据库名
     * @param tableName   数据表名
     * @param column      字段
     * @return 执行成功： true
     */
    boolean modifyColumn(DataSource dataSource, String schemaName, String tableName, MutableColumn column);

    /**
     * 表修改字段
     * @param connection  数据库连接
     * @param schemaName  方案或数据库名
     * @param tableName   数据表名
     * @param column      字段
     * @return 执行成功： true
     */
    boolean modifyColumn(Connection connection, String schemaName, String tableName, MutableColumn column);

    /**
     * 判断表是否存在
     * @param dataSource
     * @param schemaName
     * @param tableName
     * @return
     */
    boolean existsTable(DataSource dataSource, String schemaName, String tableName);

    /**
     * 获取表结构
     * @param dataSource
     * @param schemaName
     * @param tableName
     * @return
     */
    Table getTableDDL(DataSource dataSource, String schemaName, String tableName);

    /**
     * 获取表名集合
     * @param dataSource
     * @param schemaName
     * @return
     */
    List<String> getTableNames(DataSource dataSource, String schemaName);

    /**
     *  创建索引
     * @param dataSource
     * @param createIndex
     * @return
     */
    boolean createIndex(DataSource dataSource, CreateIndex createIndex);


    /**
     *  删除索引
     * @param dataSource
     * @param dropIndex
     * @return
     */
    boolean dropIndex(DataSource dataSource, DropIndex dropIndex);

    /**
     *  添加外键约束
     * @param dataSource
     * @param fkName
     * @param slaveSchemaName
     * @param slaveTableName
     * @param slaveColumns
     * @param masterSchemaName
     * @param masterTableName
     * @param masterColumns
     * @param deleteAction
     * @param updateAction
     * @return
     */
    boolean addFKConstraint(DataSource dataSource,
                                   String fkName,
                                   String slaveSchemaName,
                                   String slaveTableName,
                                   List<MutableColumn> slaveColumns,
                                   String masterSchemaName,
                                   String masterTableName,
                                   List<MutableColumn> masterColumns,
                                   ActionType deleteAction,
                                   ActionType updateAction);

    /**
     *  删除外键约束
     * @param dataSource
     * @param fkName
     * @param slaveSchemaName
     * @param slaveTableName
     * @return
     */
    boolean dropFKConstraint(DataSource dataSource,
                             String fkName,
                             String slaveSchemaName,
                             String slaveTableName);

    /**
     *  查询表的索引信息
     * @param dataSource
     * @param schemaName
     * @param tableName
     * @return
     */
    List<MutableIndex> findIndexs(DataSource dataSource,String schemaName, String tableName);

    /**
     *  查询表的唯一约束信息
     * @param dataSource
     * @param schemaName
     * @param tableName
     * @return
     */
    List<UniqueKeys> findUniqueKeys(DataSource dataSource, String catalog,String schemaName, String tableName);
}
